#ifndef __VECTOR_H__
#define __VECTOR_H__

#include <stddef.h>
#include <stdbool.h>
#include <assert.h>

#define VECTOR_MIN_CAPACITY 4

typedef void (*vector_cons_fn)(void *ele_ptr); // 对象构造函数
typedef void (*vector_free_fn)(void *ele_ptr);
typedef void (*vector_copy_fn)(const void *src, void *dst);

typedef struct Vector
{
    void *data;
    size_t element_size;
    size_t size;     // 逻辑容量
    size_t capacity; // 物理容量
    vector_cons_fn cons_fn;
    vector_free_fn free_fn;
    vector_copy_fn copy_fn;
} vector;

// 初始化vector
void vector_init(vector *v, size_t element_size, vector_cons_fn cons_fn, vector_free_fn free_fn, vector_copy_fn copy_fn);

// 释放 vector->data，不释放 vector 自身
void vector_free(vector *v);

// 返回 vector 的逻辑容量
int vector_size(const vector *v);

// 返回 vector 的物理容量
int vector_capacity(const vector *v);

// 检查 vector 是否为空
bool vector_empty(const vector *v);

// 访问指定位置的元素
#define VECTOR_AT(type, v, idx) ({       \
    assert(idx >= 0 && idx < (v)->size); \
    ((type *)(v)->data)[idx];            \
})

#define VECTOR_FRONT(type, v) VECTOR_AT(type, v, 0)

#define VECTOR_BACK(type, v) VECTOR_AT(type, v, (v)->size - 1)

void* vector_at(vector* v, int idx);

void vector_set(vector *v, int idx, const void *element);

// 添加元素到末尾
void vector_push_back(vector *v, const void *element);

// 删除最后一个元素
void vector_pop_back(vector *v);

// 删除指定下标的元素
void vector_erase(vector *v, int idx);

// 清空 vector
void vector_clear(vector *v);

// 预留存储空间
void vector_reserve(vector *v, size_t new_capacity);

// 改变 vector 大小
void vector_resize(vector *v, size_t new_size);

// 使容器物理容量与逻辑容量相匹配
// ps: 容器有最小容量限制
void vector_shrink2fit(vector *v);

// 交换俩位置元素
void vector_swap(vector *v, int idx1, int idx2);

#endif // __VECTOR_H__
